home *** CD-ROM | disk | FTP | other *** search
- /* a public domain rename, by ERS */
-
- #include <limits.h>
- #include <errno.h>
- #include <osbind.h>
- #include <string.h>
- #include <unistd.h>
- #include <stat.h>
- #include <mintbind.h>
- #include "lib.h"
-
- extern int __mint;
-
- int rename(_oldname, _newname)
- const char *_oldname, *_newname;
- {
- char oldname[PATH_MAX], newname[PATH_MAX];
- int rval;
- struct stat oldstat;
- struct stat newstat;
-
- _unx2dos(_oldname, oldname);
- _unx2dos(_newname, newname);
-
- if (__mint
- && (Fxattr(1, newname, &newstat) == 0)
- && (Fxattr(1, oldname, &oldstat) == 0)
- && (newstat.st_dev == oldstat.st_dev)
- && (newstat.st_ino == oldstat.st_ino))
- {
- /* rename("foo", "./foo"); */
- errno = EEXIST;
- return -1;
- }
-
- rval = Frename(0, oldname, newname);
- if (rval == 0)
- return 0;
- if (rval != -EXDEV && rval != -ENOENT)
- {
- (void) Fdelete (newname);
- rval = Frename(0, oldname, newname);
- }
-
- if (rval < 0) {
- errno = -rval;
- rval = -1;
- }
- return rval;
- }
-